From 8725269e0d456795710f7515292b0e279584329f Mon Sep 17 00:00:00 2001 From: Elliot Lee Date: Sun, 7 Jun 1998 17:37:15 +0000 Subject: [PATCH] Allow the user to pass --enable-mem-check and --enable-mem-profile at Allow the user to pass --enable-mem-check and --enable-mem-profile at compile time. --- glib/acconfig.h | 5 +- glib/configure.in | 20 ++++++++ glib/glibconfig.h.in | 4 +- glib/gmem.c | 119 +++++++++++++++++++++---------------------- 4 files changed, 86 insertions(+), 62 deletions(-) diff --git a/glib/acconfig.h b/glib/acconfig.h index bb6c08a737..19cd5c98d3 100644 --- a/glib/acconfig.h +++ b/glib/acconfig.h @@ -33,6 +33,10 @@ /* Other stuff */ + +#undef ENABLE_MEM_CHECK +#undef ENABLE_MEM_PROFILE + #undef G_COMPILED_WITH_DEBUGGING #undef HAVE_BROKEN_WCTYPE #undef HAVE_DOPRNT @@ -58,7 +62,6 @@ #undef SIZEOF_INT #undef SIZEOF_VOID_P - /* #undef PACKAGE */ /* #undef VERSION */ diff --git a/glib/configure.in b/glib/configure.in index ecec5f975f..886f143685 100644 --- a/glib/configure.in +++ b/glib/configure.in @@ -47,10 +47,30 @@ AM_MAINTAINER_MODE AC_CANONICAL_HOST AC_ARG_ENABLE(debug, [ --enable-debug=[no/minimum/yes] turn on debugging [default=minimum]],,enable_debug=minimum) +AC_ARG_ENABLE(mem_check, [ --enable-mem-check=[no/yes] turn on malloc/free sanity checking [default=no]],,enable_mem_check=no) +AC_ARG_ENABLE(mem_profile, [ --enable-mem-profile=[no/yes] turn on malloc profiling atexit [default=no]],,enable_mem_profile=no) AC_ARG_ENABLE(ansi, [ --enable-ansi turn on strict ansi [default=no]], , enable_ansi=no) +echo -n "Enabling memory checking... " +if test "x$enable_mem_check" = "xyes"; then + AC_DEFINE(ENABLE_MEM_CHECK, 1) + AC_SUBST(ENABLE_MEM_CHECK) + echo "yes" +else + echo "no" +fi + +echo -n "Enabling memory profiling... " +if test "x$enable_mem_profile" = "xyes"; then + AC_DEFINE(ENABLE_MEM_PROFILE, 1) + AC_SUBST(ENABLE_MEM_PROFILE) + echo "yes" +else + echo "no" +fi + if test "x$enable_debug" = "xyes"; then test "$cflags_set" = set || CFLAGS="$CFLAGS -g" CFLAGS="$CFLAGS -DG_ENABLE_DEBUG" diff --git a/glib/glibconfig.h.in b/glib/glibconfig.h.in index 8fae1ffb7c..95719f5443 100644 --- a/glib/glibconfig.h.in +++ b/glib/glibconfig.h.in @@ -15,7 +15,9 @@ /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS -/* Other stuff */ +#undef ENABLE_MEM_CHECK +#undef ENABLE_MEM_PROFILE + #undef G_COMPILED_WITH_DEBUGGING #undef HAVE_BROKEN_WCTYPE #undef HAVE_DOPRNT diff --git a/glib/gmem.c b/glib/gmem.c index 27f0cf900c..a3fa6f50aa 100644 --- a/glib/gmem.c +++ b/glib/gmem.c @@ -20,9 +20,8 @@ #include #include "glib.h" - -/* #define MEM_PROFILE */ -/* #define MEM_CHECK */ +/* #define ENABLE_MEM_PROFILE */ +/* #define ENABLE_MEM_CHECK */ #define MAX_MEM_AREA 65536L @@ -88,11 +87,11 @@ static gint g_mem_chunk_area_search (GMemArea *a, static GRealMemChunk *mem_chunks = NULL; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE static gulong allocations[4096] = { 0 }; static gulong allocated_mem = 0; static gulong freed_mem = 0; -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ #ifndef USE_DMALLOC @@ -103,22 +102,22 @@ g_malloc (gulong size) gpointer p; -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) gulong *t; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ if (size == 0) return NULL; -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) size += SIZEOF_LONG; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size += SIZEOF_LONG; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ p = (gpointer) malloc (size); @@ -126,29 +125,29 @@ g_malloc (gulong size) g_error ("could not allocate %ld bytes", size); -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = 0; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = size; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE if (size <= 4095) allocations[size-1] += 1; else allocations[4095] += 1; allocated_mem += size; -#endif /* MEM_PROFILE */ -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ return p; @@ -160,22 +159,22 @@ g_malloc0 (gulong size) gpointer p; -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) gulong *t; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ if (size == 0) return NULL; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE size += SIZEOF_LONG; -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size += SIZEOF_LONG; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ p = (gpointer) calloc (size, 1); @@ -183,29 +182,29 @@ g_malloc0 (gulong size) g_error ("could not allocate %ld bytes", size); -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = 0; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = size; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE if (size <= 4095) allocations[size-1] += 1; else allocations[4095] += 1; allocated_mem += size; -#endif /* MEM_PROFILE */ -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ return p; @@ -217,42 +216,42 @@ g_realloc (gpointer mem, { gpointer p; -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) gulong *t; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ if (size == 0) return NULL; -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) size += SIZEOF_LONG; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size += SIZEOF_LONG; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ if (!mem) p = (gpointer) malloc (size); else { -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) t = (gulong*) ((guchar*) mem - SIZEOF_LONG); -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE freed_mem += *t; -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ mem = t; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK t = (gulong*) ((guchar*) mem - SIZEOF_LONG); if (*t >= 1) g_warning ("trying to realloc freed memory\n"); mem = t; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ p = (gpointer) realloc (mem, size); } @@ -261,29 +260,29 @@ g_realloc (gpointer mem, g_error ("could not reallocate %ld bytes", size); -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = 0; -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) size -= SIZEOF_LONG; t = p; p = ((guchar*) p + SIZEOF_LONG); *t = size; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE if (size <= 4095) allocations[size-1] += 1; else allocations[4095] += 1; allocated_mem += size; -#endif /* MEM_PROFILE */ -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ return p; @@ -294,21 +293,21 @@ g_free (gpointer mem) { if (mem) { -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) gulong *t; gulong size; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ -#if defined(MEM_PROFILE) || defined(MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK) t = (gulong*) ((guchar*) mem - SIZEOF_LONG); size = *t; -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE freed_mem += size; -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ mem = t; -#endif /* MEM_PROFILE || MEM_CHECK */ +#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK t = (gulong*) ((guchar*) mem - SIZEOF_LONG); if (*t >= 1) g_warning ("freeing previously freed memory\n"); @@ -316,9 +315,9 @@ g_free (gpointer mem) mem = t; memset ((guchar*) mem + 8, 0, size); -#else /* MEM_CHECK */ +#else /* ENABLE_MEM_CHECK */ free (mem); -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ } } @@ -328,7 +327,7 @@ g_free (gpointer mem) void g_mem_profile (void) { -#ifdef MEM_PROFILE +#ifdef ENABLE_MEM_PROFILE gint i; for (i = 0; i < 4095; i++) @@ -340,20 +339,20 @@ g_mem_profile (void) g_print ("%lu bytes allocated\n", allocated_mem); g_print ("%lu bytes freed\n", freed_mem); g_print ("%lu bytes in use\n", allocated_mem - freed_mem); -#endif /* MEM_PROFILE */ +#endif /* ENABLE_MEM_PROFILE */ } void g_mem_check (gpointer mem) { -#ifdef MEM_CHECK +#ifdef ENABLE_MEM_CHECK gulong *t; t = (gulong*) ((guchar*) mem - SIZEOF_LONG - SIZEOF_LONG); if (*t >= 1) g_warning ("mem: 0x%08x has been freed: %lu\n", (gulong) mem, *t); -#endif /* MEM_CHECK */ +#endif /* ENABLE_MEM_CHECK */ } GMemChunk* -- 2.30.2